package fiuba.td.fabrica.model.beans;

import java.util.ArrayList;
import java.util.List;

import fiuba.td.fabrica.model.entities.CintaTransportadora;
import fiuba.td.fabrica.model.entities.Conectable;
import fiuba.td.fabrica.model.entities.ElementoFabrica;
import fiuba.td.fabrica.model.entities.Maquina;
import fiuba.td.fabrica.model.entities.Producto;
import fiuba.td.fabrica.model.exceptions.ConexionCintaTransportadoraOcupadaException;
import fiuba.td.fabrica.model.exceptions.ConexionConectableOcupadoException;

/**
 * 
 */
public class LineaProduccionBean implements Comparable<LineaProduccionBean>{
	private Producto producto;
	private List<ElementoFabrica> elementosFabrica;
	private List<Maquina> maquinas;
	private Maquina maquinaInicial;
	private boolean habilitada;
	private double inversion;
	

	public LineaProduccionBean(Producto producto, double inversion ) {
		this.producto = producto;
		this.elementosFabrica = new ArrayList<ElementoFabrica>();
		this.maquinas = new ArrayList<Maquina>();
		this.maquinaInicial = null;
		this.habilitada = (inversion == 0);
		this.inversion = inversion;
	}

	public Producto getProducto() {
		return producto;
	}

	public void setProducto(Producto producto) {
		this.producto = producto;
	}

	public List<ElementoFabrica> getElementosFabrica() {
		return elementosFabrica;
	}

	public void setElementosFabrica(List<ElementoFabrica> elementosFabrica) {
		this.elementosFabrica = elementosFabrica;
	}

	public List<Maquina> getMaquinas() {
		return maquinas;
	}

	public void setMaquinas(List<Maquina> maquinas) {
		this.maquinas = maquinas;
	}

	public Maquina getMaquinaInicial() {
		return maquinaInicial;
	}

	public void setMaquinaInicial(Maquina maquinaInicial) {
		this.maquinaInicial = maquinaInicial;
	}

	public boolean isHabilitada() {
		return habilitada;
	}

	public void setHabilitada(boolean habilitada) {
		this.habilitada = habilitada;
	}

	public double getInversion() {
		return inversion;
	}

	public void setInversion(double inversion) {
		this.inversion = inversion;
	}

	/**
	 * Agrega la maquina a lista de elementos de la linea.
	 * @param maquina
	 */
	public void addMaquina(Maquina maquina) {
		this.elementosFabrica.add(maquina);
		this.maquinas.add(maquina);
	}

	/**
	 * Agrega los parametros a los elementos de la fabrica y conecta los elementos de salida 
	 * a la cinta transportadora.
	 * @throws ConexionCintaTransportadoraOcupadaException
	 * @throws ConexionConectableOcupadoException
	 */
	public void addCintaTransportadora(CintaTransportadora cintaTransportadora,	Maquina elementoSalida, Conectable elementoEntrada) throws ConexionCintaTransportadoraOcupadaException, ConexionConectableOcupadoException {
		this.elementosFabrica.add(cintaTransportadora);
		cintaTransportadora.conectar(elementoSalida, elementoEntrada);		
	}

	/**
	 * Agrega los parametros a los elementos de la fabrica y conecta los elementos de entrada y salida 
	 * a la cinta transportadora.
	 * @throws ConexionCintaTransportadoraOcupadaException
	 * @throws ConexionConectableOcupadoException
	 */
	public void addCintaTransportadora(CintaTransportadora cintaTransportadora,
			Maquina elementoSalida, Maquina elementoEntrada) throws ConexionCintaTransportadoraOcupadaException, ConexionConectableOcupadoException {
		this.elementosFabrica.add(cintaTransportadora);
		cintaTransportadora.conectar(elementoSalida, elementoEntrada);
	}

	/**
	 * Habilito la linea de produccion
	 */
	public void habilitar (){
		this.habilitada = true;
	}

	/**
	 * Deshabilito la linea de produccion
	 */
	public void deshabilitar (){
		this.habilitada = false;
	}

	/**
	 * La ocmparacion tiene que ser por costos de inversion porque la usa el laboratorio
	 */
	public int compareTo(LineaProduccionBean o) {
		if (this.getInversion() < o.getInversion())
			return -1;
		else if (this.getInversion() > o.getInversion())
			return 1;
		
		return 0;
	}

	
	public String toString() {
		StringBuilder buffer = new StringBuilder();
		buffer.append("Producto: " + this.getProducto().getNombre() + "\n");
		buffer.append("Inversion: $" + this.getInversion() + "\n");
		buffer.append("Habilitada: " + (this.isHabilitada() ? "Si" : "No") + "\n");
		buffer.append("Maquinas: ");
		
		Maquina maquina = this.getMaquinaInicial();
		buffer.append("\"" + maquina.getNombre() + "\"");
		
		while (maquina.getSalida() != null){
			maquina = (Maquina)(maquina.getSalida().getElementoEntrada());
			buffer.append(" - " + "\"" + maquina.getNombre()+ "\"");
		}
		
		return buffer.toString(); 
	}
}
